﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity.InterceptionExtension;
namespace Command
{
    public class ExceptionLogBehavior:IInterceptionBehavior
    {
        /// <summary>
        /// 获取当前行为需要拦截的对象类型接口。
        /// </summary>
        /// <returns>所有需要拦截的对象类型接口。</returns>
        public IEnumerable<Type> GetRequiredInterfaces()
        {
            return Type.EmptyTypes;
        }
        /// <summary>
        /// 通过实现此方法来拦截调用并执行所需的拦截行为。
        /// </summary>
        /// <param name="input">调用拦截目标时的输入信息。</param>
        /// <param name="getNext">通过行为链来获取下一个拦截行为的委托。</param>
        /// <returns>从拦截目标获得的返回信息。</returns>
        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            Console.WriteLine("执行前");
            IMethodReturn retvalue = getNext()(input, getNext);
           
            #region 参数部分
            Console.WriteLine("-------------参数内容---------------");
            for (int i = 0; i < input.Arguments.Count; i++)
            {
                var parameter = input.Arguments[i];
                Console.WriteLine(string.Format("第{0}个参数值为:{1}", i+1, parameter.ToString()));
            }
            Console.WriteLine("------------------------------------");
            #endregion

            #region 异常处理部分
            if (retvalue.Exception == null)
            {
                Console.WriteLine("执行成功，无异常");
            }
            else
            {
                //记录异常的内容 比如Log4Net等
                new Log4NetFile().Log("异常的内容为：" + retvalue.Exception.Message);
                //retvalue.Exception设为null表示异常已经被处理过了
                retvalue.Exception = null;
            }
            #endregion
            Console.WriteLine("完成");
            return retvalue; 
        }

        /// <summary>
        /// 获取一个<see cref="Boolean"/>值，该值表示当前拦截行为被调用时，是否真的需要执行
        /// 某些操作。
        /// </summary>
        public bool WillExecute
        {
            get { return true; }
        }
    }
}
